#!/usr/bin/env node
const program = require('commander');
const log4js = require("log4js");
const Log = log4js.getLogger();
const log4js_config = require("../log4js.json");
log4js.configure(log4js_config);
const Master = require("./Master")
const Proxy = require("./Proxy")

program
    .version('1.0.0')
    .option('-m', 'Master 模式，在服务端执行。')
    .option('-p', 'Proxy 模式，在目标端执行。')
    .option('--pwd <password>', '(必填) Master 的口令。')
    .option('--mport <port>', 'Master 监听的端口。默认 10000', parseInt , 10000)
    .option('--mip <ip>', '(Proxy 必填) Master 的 ip。')
    .option('--lip <ip>', '(Proxy 选填) 目标服务的 ip。默认 localhost')
    .option('--lport <port>', '(Proxy 必填) 目标服务监听的端口。', parseInt)
    .option('--rport <port>', '(Proxy 必填) 映射到远程的端口。', parseInt)
    .parse(process.argv);


if( program.M ){
    if( program.pwd ){
        Log.debug("使用 Master 模式启动")
        let master = new Master(program.mport, program.pwd);
        try {
            master.start();
        }catch (e){
            Log.error(e)
        }
    }else{
        Log.error("必须提供口令！")
    }

}else if( program.P ){
    let check = true;
    if( ! program.pwd ){
        Log.error("必须提供口令！")
        check = false;
    }
    if( ! program.mip){
        Log.error("必须提供 Master 监听的 ip ！");
        check = false;
    }

    if( ! program.lport){
        Log.error("必须提供 目标服务的端口 ！");
        check = false;
    }

    if( ! program.rport){
        Log.error("必须提供 映射到远程的端口 ！");
        check = false;
    }

    if( check ){
        Log.debug("使用 Proxy 模式启动")
        let proxy = new Proxy(
            program.mip,
            program.mport,
            program.pwd,
            program.rport,
            program.lport,
            program.lip
        )
        proxy.start();
    }

}else{
    program.help();
}


// process.on('uncaughtException', function (err) {
//     Log.error(err);
// });